skynet = require "skynet"

local function task(id)
        for i = 1,5 do     
            skynet.error("task"..id .." call")  
            skynet.error("task"..id .." return:", skynet.call(".echoserver", "lua", "task"..id))   
            -- 调用call的时候会阻塞自动让出协程
        end
end

skynet.start(function()
     skynet.fork(task, 1)   --开两个协程去执行
     skynet.fork(task, 2)
end)

-- 不会被剥夺执行权：一个正在运行的协程不会被其他协程强行剥夺 CPU 执行权
-- 必须主动让出：只有当一个协程主动调用coroutine.yield()或者执行结束时，其他协程才有机会运行
-- 如果不让出就会一直运行：如果一个协程进入了无限循环并且没有任何让出操作，它会一直占用 CPU，其他协程将永远无法得到执行机会
-- Skynet 中的特殊情况
-- 虽然 Lua 原生协程是协作式的，但 Skynet 框架对协程调度做了一些增强：
-- 系统调用会自动让出：当协程调用skynet.call、skynet.send、skynet.sleep等 Skynet API 时，框架会自动让当前协程让出 CPU
-- 消息处理的边界：每个消息处理函数执行完毕后，协程也会让出 CPU
-- 监控机制：Skynet 有监控机制来检测长时间运行的协程，防止它们独占 CPU